
-- emp = {"北京",nil, name="张三", age=23, "上海", depart="销售部", "广州","深圳"}
-- print(emp.x) -- nil

-- -- 声明一个元表
-- meta = {}

-- -- 将原始表与元表相关联
-- setmetatable(emp, meta)

-- meta.__index = function (tab, key)
--     return "该【"..key.."】 key 不存在"
-- end

-- print(emp.x) -- 该【x】 key 不存在
-- print(emp[2]) -- 该【2】 key 不存在

-- ====================================================================================

-- emp = {"北京", name="张三", age=23, "上海", depart="销售部", "广州", "深圳"}

-- print(emp[5]) -- nil

-- -- 声明一个元表
-- meta = {}

-- -- 将原始表与元表关联
-- setmetatable(emp, meta)

-- -- 再定义一张普通表
-- other = {}

-- other[5]="天津"
-- other[6]="西安"

-- -- 指定元表为另一个普通表
-- meta.__index=other

-- -- 在原始表中如果找不到，会到元表指定的普通表中查找 
-- print(emp[5]) -- 天津
-- print(emp[7]) -- nil

-- ======================================================================
-- emp = {"北京", name="张三", age=23, "上海", depart="销售部", "广州", "深圳"}

-- -- 声明一个元表
-- meta = {}

-- -- 将原始表与元表关联
-- setmetatable(emp, meta)

-- -- 有返回值的情况
-- function meta.__newindex(tab, key, value)
--     print("新增的key为"..key.."，value为"..value)
--     -- 将新增的key-value写入到原始表中
--     rawset(tab,key,value)
-- end

-- emp.x="天津"
-- print(emp.x)

-- ============================================================================

-- emp = {"北京", name="张三", age=23, "上海", depart="销售部", "广州", "深圳"}

-- -- 声明一个元表
-- meta = {}

-- -- 将原始表与元表关联
-- setmetatable(emp, meta)

-- -- 再定义一张普通表
-- other = {}

-- -- 元表指定的另一个普通表的作用是、暂存新增加的数据
-- math.__newindex = other

-- emp.y="天津"

-- print(emp.y) -- 天津
-- print(other.y) -- nil

-- ============================================================================

-- emp = {"北京", name="张三", age=23, "上海", depart="销售部", "广州",12, "深圳"}

-- -- 声明一个元表
-- meta = {
--     __add = function (tab,num)
--         -- 遍历tab中的所有元素
--         for k, v in pairs(tab) do
--             -- 若 value 为数值类型，则做加法
--             if type(v) == "number" then
--                 tab[k] = v + num
--             -- 若 value 为字符串类型，则做字符串拼接
--             elseif type(v) == "string" then
--                 tab[k] = v..num
--             end
--         end
--         return tab
--     end ,
--     __tostring = function (tab)
--         for k, v in pairs(tab) do
--             print(k,v)
--         end
--     end
-- };

-- -- 将原始表与元表关联
-- setmetatable(emp, meta)

-- empsum = emp + 5

-- -- for k, v in pairs(empsum) do
-- --     print(k,v)
-- -- end

-- print(emp)

-- ===================================================================================

-- 单独定义元表 的使用
require 'meta'

emp = {"北京", name="张三", age=23, "上海", depart="销售部", "广州",12, "深圳"}

-- 将原始表与元表关联
setmetatable(emp, meta)

empsum = emp + 5

-- for k, v in pairs(empsum) do
--     print(k,v)
-- end

print(emp)